<?php

/**
 * Description of ClienteDAO
 *
 * @author Hiago
 */
class ClienteDAO {

    public static function inserir(Cliente $cliente) {
        $usuarioDAO = new UsuarioDAO();
        $usuarioDAO->inserir($cliente->getUsuario());

        $con = new bd();
        try {
            $con->beginTransaction();
            $stmt = $con->prepare("INSERT INTO `cliente`(`nome`, `sobrenome`,`telefone`, `data_cadastro`, `id_usuario`)
                               VALUES (?,?,?,NOW(),?);");

            $usuario = $cliente->getUsuario();
            $dados = Array($cliente->getNome(), $cliente->getSobrenome(), $cliente->getTelefone(), $usuario->getIdUsuario());
            $stmt->execute($dados);
            $id = $con->lastInsertId();
            $con->ocorreramErros($stmt);
            $cliente->setIdCliente($id);

            $enderecoDAO = new EnderecoDAO();
            $enderecoPrincipal = $cliente->getEnderecoPrincipal();
            if ($enderecoPrincipal != null) {
                $enderecoDAO->inserir($enderecoPrincipal);

                $stmt = $con->prepare("INSERT INTO `cliente_endereco` (`id_cliente`, `id_endereco`, `isPrincipal`)
                                       VALUES (?,?,?);");
                $dados = Array($cliente->getIdCliente(), $enderecoPrincipal->getIdEndereco(), TRUE);
                $stmt->execute($dados);
                $con->ocorreramErros($stmt);
            }
            if (($enderecos = $cliente->getEnderecos()) != null)
                foreach ($cliente->getEnderecos() as $endereco) {
                    $enderecoDAO->inserir($endereco);
                    $stmt = $con->prepare("INSERT INTO `cliente_endereco` (`id_cliente`, `id_endereco`, `isPrincipal`)
                                       VALUES (?,?,?);");
                    $dados = Array($cliente->getIdCliente(), $endereco->getIdEndereco(), FALSE);
                    $stmt->execute($dados);
                    $con->ocorreramErros($stmt);
                }

            $con->commit();
        } catch (Exception $ex) {
            $con->rollBack();
        }
    }

    public static function atualizar(Cliente $cliente) {
        $con = new bd();
        $stmt = $con->prepare("UPDATE cliente SET nome =?, sobrenome =?, telefone = ? WHERE id_usuario = ?");
        $dados = Array($cliente->getNome(), $cliente->getSobrenome(), $cliente->getTelefone(), $cliente->getIdUsuario());
        $stmt->execute($dados);
        $con->ocorreramErros($stmt);
        $enderecos = $cliente->getEnderecos();
        EnderecoDAO::atualizar($enderecos[0]);
    }

    public static function getById($id) {
        $con = new bd();
        $stmt = $con->prepare("SELECT `cliente`.`idCliente`,`cliente`.`nome`,`cliente`.`sobrenome`,
                              `cliente`.`telefone`,`cliente`.`data_cadastro`,`cliente`.`id_usuario`
                              FROM `cliente` WHERE `cliente`.`id_usuario` = ?;");
        $stmt->execute(Array($id));
        $con->ocorreramErros($stmt);

        $r = $stmt->fetch();
        $usuarioDAO = new UsuarioDAO();
        $usuario = $usuarioDAO->getById($r[5]);
        $cliente = new Cliente($usuario, $r[0], $r[1], $r[2], $r[3], $r[4]);
        $cliente->setEnderecos(self::getEnderecos($r[0]));
        $cliente->setEnderecoPrincipal(self::getEnderecoPrincipal($r[0]));

        return $cliente;
    }

    public function listar() {
        $con = new bd();
        $stmt = $con->prepare("SELECT `cliente`.`idCliente`,`cliente`.`nome`,`cliente`.`sobrenome`,
                              `cliente`.`telefone`,`cliente`.`data_cadastro`,`cliente`.`id_usuario`
                              FROM `cliente`;");
        $stmt->execute();
        $con->ocorreramErros($stmt);

        $clientes = Array();
        while ($r = $stmt->fetch()) {
            $usuarioDAO = new UsuarioDAO();
            $usuario = $usuarioDAO->getById($r[5]);
            $cliente = new Cliente($usuario, $r[0], $r[1], $r[2], $r[3], $r[4]);
            $cliente->setEnderecos($this->getEnderecos($cliente->getIdCliente()));
            $cliente->setEnderecoPrincipal(self::getEnderecoPrincipal($cliente->getIdCliente()));

            $clientes[] = $cliente;
        }
        return $clientes;
    }

    public function excluir(Cliente $cliente) {
        $usuarioDAO = new UsuarioDAO();
        $usuarioDAO->excluir($cliente);
    }

    private static function getEnderecos($idCliente) {
        $enderecoDAO = new EnderecoDAO();
        $con = new bd();
        $stmt = $con->prepare("SELECT `cliente_endereco`.`id_endereco`
                               FROM `cliente_endereco` where `cliente_endereco`.`id_cliente` = ?;");
        $stmt->execute(Array($idCliente));
        $con->ocorreramErros($stmt);

        $enderecos = Array();
        while ($r = $stmt->fetch()) {
            $enderecos[] = $enderecoDAO->getById($r[0]);
        }
        return $enderecos;
    }

    private static function getEnderecoPrincipal($idCliente) {
        $enderecoDAO = new EnderecoDAO();
        $con = new bd();
        $stmt = $con->prepare("SELECT `cliente_endereco`.`id_endereco` FROM `cliente_endereco`
                              where `cliente_endereco`.`id_cliente` = ? AND `isPrincipal` = true;");
        $stmt->execute(Array($idCliente));
        $con->ocorreramErros($stmt);

        $r = $stmt->fetch();
        return $enderecoDAO->getById($r[0]);
    }

}

?>
